/**
 * DuzaLiczbaZespolona.cpp
 *
 * Version: $Id: DuzaLiczbaZespolona.cpp 89 2012-01-17 21:42:17Z s8376@pjwstk.edu.pl $
 */
#include <iostream>
#include "DuzaLiczbaZespolona.h"

using namespace std;

/**
 * Konstruktory
 */
DuzaLiczbaZespolona::DuzaLiczbaZespolona()
{
    m_real = new DuzaLiczba();
    m_imagine = new DuzaLiczba();
}
DuzaLiczbaZespolona::DuzaLiczbaZespolona(int real)
{
    m_real = new DuzaLiczba(real);
    m_imagine = new DuzaLiczba();
}
DuzaLiczbaZespolona::DuzaLiczbaZespolona(int real, int imagine)
{
    m_real = new DuzaLiczba(real);
    m_imagine = new DuzaLiczba(imagine);
}
DuzaLiczbaZespolona::DuzaLiczbaZespolona(char* real)
{
    m_real = new DuzaLiczba(real);
    m_imagine = new DuzaLiczba();
}
DuzaLiczbaZespolona::DuzaLiczbaZespolona(char* real, char* imagine)
{
    m_real = new DuzaLiczba(real);
    m_imagine = new DuzaLiczba(imagine);
}
DuzaLiczbaZespolona::DuzaLiczbaZespolona(DuzaLiczba real, DuzaLiczba imagine)
{
    m_real = new DuzaLiczba(real);
    m_imagine = new DuzaLiczba(imagine);
}
DuzaLiczbaZespolona::DuzaLiczbaZespolona(const DuzaLiczbaZespolona& object)
{
    m_real = new DuzaLiczba(*object.m_real);
    m_imagine = new DuzaLiczba(*object.m_imagine);
}
/**
 * Destruktor
 */
DuzaLiczbaZespolona::~DuzaLiczbaZespolona()
{
    delete m_real;
    delete m_imagine;
}
/**
 * Operatory
 */
DuzaLiczbaZespolona& DuzaLiczbaZespolona::operator=(const DuzaLiczbaZespolona& object)
{
    if (this != &object) {
        m_real = new DuzaLiczba(*object.m_real);
        m_imagine = new DuzaLiczba(*object.m_imagine);
    }

    return *this;
}
DuzaLiczbaZespolona& DuzaLiczbaZespolona::operator=(int value)
{
    m_real = new DuzaLiczba(value);
    m_imagine = new DuzaLiczba();

    return *this;
}
DuzaLiczbaZespolona DuzaLiczbaZespolona::operator+(DuzaLiczbaZespolona object)
{
    return DuzaLiczbaZespolona(*m_real + *object.m_real, *m_imagine
            + *object.m_imagine);
}
DuzaLiczbaZespolona DuzaLiczbaZespolona::operator-(DuzaLiczbaZespolona object)
{
    return DuzaLiczbaZespolona(*m_real - *object.m_real, *m_imagine
            - *object.m_imagine);
}
DuzaLiczbaZespolona DuzaLiczbaZespolona::operator-()
{
    return DuzaLiczbaZespolona(-*m_real, -*m_imagine);
}
DuzaLiczbaZespolona DuzaLiczbaZespolona::operator*(DuzaLiczbaZespolona object)
{
    return DuzaLiczbaZespolona(*m_real * *object.m_real, *m_imagine
            * *object.m_imagine);
}
DuzaLiczbaZespolona DuzaLiczbaZespolona::operator/(DuzaLiczbaZespolona object)
{
    // FIXME
    //    *m_real * *object.m_real, *m_imagine * *object.m_imagine


    return DuzaLiczbaZespolona();
}
DuzaLiczbaZespolona& DuzaLiczbaZespolona::operator+=(DuzaLiczbaZespolona const& object)
{
    m_real = new DuzaLiczba(*m_real + *object.m_real);
    m_imagine = new DuzaLiczba(*m_imagine + *object.m_imagine);

    return *this;
}
DuzaLiczbaZespolona& DuzaLiczbaZespolona::operator+=(int value)
{
    m_real = new DuzaLiczba(*m_real + DuzaLiczba(value));

    return *this;
}
DuzaLiczbaZespolona& DuzaLiczbaZespolona::operator-=(DuzaLiczbaZespolona const& object)
{
    m_real = new DuzaLiczba(*m_real - *object.m_real);
    m_imagine = new DuzaLiczba(*m_imagine - *object.m_imagine);

    return *this;
}
DuzaLiczbaZespolona& DuzaLiczbaZespolona::operator*=(DuzaLiczbaZespolona const& object) {
    m_real = new DuzaLiczba(*m_real * *object.m_real);
    m_imagine = new DuzaLiczba(*m_imagine * *object.m_imagine);

    return *this;
}
DuzaLiczbaZespolona& DuzaLiczbaZespolona::operator/=(DuzaLiczbaZespolona const& object)
{
    // FIXME
    return *this;
}

bool operator==(const DuzaLiczbaZespolona& object1, const DuzaLiczbaZespolona& object2)
{
    if (*object1.m_real == *object2.m_real && *object1.m_imagine == *object2.m_imagine)
         return true;
     else
         return false;
}
bool operator==(const DuzaLiczbaZespolona& object, int value)
{
    if (*object.m_real == DuzaLiczba(value) && *object.m_imagine == DuzaLiczba())
        return true;
    else
        return false;
}
bool operator!=(const DuzaLiczbaZespolona& object1, const DuzaLiczbaZespolona& object2)
{
    if (*object1.m_real == *object2.m_real && *object1.m_imagine == *object2.m_imagine)
             return false;
         else
             return true;
}

bool DuzaLiczbaZespolona::operator>=(int value) const
{
    // FIXME
    return false;
}
bool DuzaLiczbaZespolona::operator<(const char* value) const
{
    // FIXME
    return false;
}

ostream& operator<<(ostream& out, const DuzaLiczbaZespolona& object)
{
    cout << *object.m_real << " + " << *object.m_imagine << "i";
    return out;
}
istream& operator>>(istream& in, DuzaLiczbaZespolona& object)
{
    in >> *object.m_real >> *object.m_imagine;
    return in;
}
